module sequence_event ();

logic a, b, c;
logic clk = 0;

// 定义一个序列 abc，表示 a、b、c 依次发生
// 其中 a、b、c 是逻辑变量，##1 表示它们之间的时间间隔为 1 个时钟周期
// 该序列表示 a 先于 b，b 先于 c
// 也就是说，a、b、c 必须按顺序发生
// 这里的 ##1 表示在一个时钟周期内发生
sequence abc; 
    @(posedge clk) a ##1 b ##1 c; 
endsequence

// 每次 clk 上升沿时，检查 abc 是否匹配（即 a→b→c 是否按顺序发生）
// 如果匹配，则打印消息
always @ (posedge clk) begin
    @ (abc) $display ("@%g ABC all are asserted", $time);
end

// Testbench code
initial begin
    $monitor("@%g clk %b a %b b %b c %b", $time, clk, a, b, c); 
    repeat (2) begin
        #2 a = 1;
        #2 b = 1;
        #2 c = 1;
        #2 a = 0;
        b = 0;
        c = 0;
    end
    #2 $finish;
end

always #1 clk = ~clk;

endmodule
